perm filename FOO[MBS,LCS] blob sn#276925 filedate 1977-04-18 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.<< General PUB Macros in GENRAL.PUB[SUB,SYS]
C00003 00003	.<< Set up fonts and text responses for device selected. >>
C00010 00004	.<< Digest number of sides per page and columns per side. >>
C00012 00005	.<< Set line spacing to new value. >>
C00013 00006	.<< Number sections. >>
C00018 00007	.<< Start text justification. >>
C00019 00008	.<< Put in a footnote. >>
C00020 00009	.<< Generate table of contents. >>
C00022 00010	.<< Set up for body of text. >>
C00023 ENDMK
C⊗;
.<< General PUB Macros in GENRAL.PUB[SUB,SYS]
.	    Version 1.1, 4 March 1976
.		 Brian P. McCune
.
.Documentation for this set of general PUB macros is in GENRAL.BPM[UP,DOC]. >>
.<< Set up fonts and text responses for device selected. >>
.
.IF THISDEVICE = "XGP" THEN
.
.START "XGP"
.
.<< Turn on quote character ("α") and font switching character ("%"). >>
.
.TURN ON "α%";
.
.
.AT "//" ENTRY "/"
.	⊂
.	LASTFONT1 ← THISFONT;
.	("%2ENTRY%" & LASTFONT1);
.	⊃;
.
.AT "⊗⊗" ENTRY "⊗"
.	⊂
.	LASTFONT2 ← THISFONT;
.	("%3ENTRY%" & LASTFONT2);
.	⊃;
.
.<< Print page headings on XGP (using boldface) before new page started. >>
.
.RECURSIVE MACRO STANDARD TITLES
.	⊂
.	IF !HF THEN
.		BEGIN "OUTPUT HEADING"
.		NOFILL;
.		TURN ON "←→{";
.		PREFACE 0;
.		INDENT 0,0,0;
.		IF EVEN PAGE
.			THEN
.				START "LOOK FOR EVEN PAGE HEADING"
.				IF LENGTH(!EH) THEN
.					START "OUTPUT EVEN PAGE HEADING"
.					PLACE HEADING;
.					SELECT 3;
.					!EH;
.					END "OUTPUT EVEN PAGE HEADING";
.				END "LOOK FOR EVEN PAGE HEADING"
.			ELSE
.				START "LOOK FOR ODD PAGE HEADING"
.				IF LENGTH(!OH) THEN
.					START "OUTPUT ODD PAGE HEADING"
.					PLACE HEADING;
.					SELECT 3;
.					!OH;
.					END "OUTPUT ODD PAGE HEADING";
.				END "LOOK FOR ODD PAGE HEADING";
.		END "OUTPUT HEADING";
.	⊃;
.
.END "XGP"
.
.ELSE IF THISDEVICE = "LPT" THEN
.
.START "LPT"
.
.<< Turn on quote character ("α"), underline characters ("↓_"), and font switching
.character ("%") just for compatibility with XGP. >>
.
.TURN ON "α↓_%";
.
.<< Print //underlined/ or ⊗⊗in all capital letters⊗. >>
.
.AT "//" ENTRY "/" ⊂ "↓_ENTRY_↓" ⊃;
.
.AT "⊗⊗" ENTRY "⊗" ⊂ (↑ "ENTRY"); ⊃;
.
.<< Print page headings on LPT (using all capitals) before new page started. >>
.
.RECURSIVE MACRO STANDARD TITLES
.	⊂
.	IF !HF THEN
.		BEGIN "OUTPUT HEADING"
.		NOFILL;
.		TURN ON "←→{";
.		PREFACE 0;
.		INDENT 0,0,0;
.		IF EVEN PAGE
.			THEN
.				START "LOOK FOR EVEN HEADING"
.				IF LENGTH(!EH) THEN
.					START "OUTPUT EVEN HEADING"
.					PLACE HEADING;
⊗⊗{!EH}⊗
.					END "OUTPUT EVEN HEADING";
.				END "LOOK FOR EVEN HEADING"
.			ELSE
.				START "LOOK FOR ODD HEADING"
.				IF LENGTH(!OH) THEN
.					START "OUTPUT ODD HEADING"
.					PLACE HEADING;
⊗⊗{!OH}⊗
.					END "OUTPUT ODD HEADING";
.				END "LOOK FOR ODD HEADING";
.		END "OUTPUT HEADING";
.	⊃;
.
.END "LPT"
.
.ELSE USERERR("DEVICE argument not XGP or LPT");
.<< Digest number of sides per page and columns per side. >>
.
.<< Make sure one or two sides chosen. >>
.
.IF SIDES ≠ 1 ∧ SIDES ≠ 2 THEN USERERR("SIDES argument not 1 or 2");
.
.<< Set up page frame and COLMNS macro for selected device. >>
.
.TITLE AREA HEADING LINES 1 TO 3;
.IF THISDEVICE = "XGP"
.	THEN
.		START "XGP"
.		PAGE FRAME 54 HIGH 82 WIDE;
.		ODDLEFTBORDER ← EVENLEFTBORDER ← 1000;
.		MACRO COLMNS(NUMCOLS)
.			⊂
.			IF NUMCOLS = 1
.				THEN AREA TEXT LINES 4 TO 54
.				ELSE IF NUMCOLS = 2
.					THEN AREA TEXT LINES 4 TO 54 IN 2 COLUMNS 5 APART
.				ELSE USERERR("COLMNS argument not 1 or 2");
.			COLS ← NUMCOLS;
.			SSNAME ← NULL;
.			PLACE TEXT;
.			NEXT PAGE;
.			⊃;
.		END "XGP"
.	ELSE
.		START "LPT"
.		PAGE FRAME 53 HIGH 65 WIDE;
.		MACRO COLMNS(NUMCOLS)
.			⊂
.			IF NUMCOLS = 1
.				THEN AREA TEXT LINES 4 TO 53
.				ELSE IF NUMCOLS = 2
.					THEN AREA TEXT LINES 4 TO 53 IN 2 COLUMNS 5 APART
.				ELSE USERERR("COLMNS argument not 1 or 2");
.			COLS ← NUMCOLS;
.			SSNAME ← NULL;
.			PLACE TEXT;
.			NEXT PAGE;
.			⊃;
.		END "LPT";
.<< Set line spacing to new value. >>
.
.MACRO SPACES(NUMSPACES)
.	⊂
.	IF NUMSPACES > 0
.		THEN
.			START "SET NEW INTER- AND INTRA-PARAGRAPH SPACING"
.			BREAK;
.			PREFACE NUMSPACES;
.			SPREAD ← NUMSPACES;
.			END "SET NEW INTER- AND INTRA-PARAGRAPH SPACING"
.		ELSE USERERR("SPACES argument not positive integer");
.	⊃;
.<< Number sections. >>
.
.<< Either go to new page or not upon new section or appendix. >>
.
.MACRO NEW_PAGE_ON_SECTION(NEW_PAGE_FLAG)
.	⊂
.	IF NEW_PAGE_FLAG = TRUE
.		THEN MACRO NEW SECTION
.			⊂
.			SKIP TO COLUMN 1;
.			IF SIDES = 2 ∧ EVEN PAGE THEN NEXT PAGE;
.			⊃
.		ELSE IF NEW_PAGE_FLAG = FALSE THEN MACRO NEW SECTION
.			⊂
.			IF LINES < (6 + 6*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 3;
.			⊃
.		ELSE USERERR("NEW_PAGE_ON_SECTION argument not TRUE or FALSE");
.	⊃;
.
.<< Generate section heading and table of contents entry. >>
.
.COUNT SECTION FROM 1 TO 99;
.MACRO S(NAME)
.	⊂
.	SECNAME ← SSNAME ← NULL;
.		BEGIN "PRINT SECTION HEADING"
.		NEW SECTION;
.		NEXT SECTION;
.		TURN ON "{";
.		INDENT 0,4,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SECTION!}.  NAME⊗
.		SKIP 1;
.		SECNAME ← "NAME";
.		SEND CONTENTS
.			⊂
.			INDENT 0,4,4;
.			SKIP 1;
.			GUARANTEE LINES 6;
{SECTION!}.  NAME→  {PAGE!}
.			⊃;
.		END "PRINT SECTION HEADING";
.	⊃;
.
.<< Generate subsection heading and table of contents entry. >>
.
.COUNT SUBSECTION FROM 1 TO 99 IN SECTION PRINTING "!.1";
.MACRO SS(NAME)
.	⊂
.	SSNAME ← NULL;
.		BEGIN "PRINT SUBSECTION HEADING"
.		IF LINES < (5 + 5*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 2;
.		NEXT SUBSECTION;
.		TURN ON "{";
.		INDENT 3,8,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SUBSECTION!}  NAME⊗
.		SSNAME ← "NAME";
.		SEND CONTENTS
.			⊂
.			INDENT 4,9,4;
.			GUARANTEE LINES 4;
{SUBSECTION!}  NAME→  {PAGE!}
.			⊃;
.		END "PRINT SUBSECTION HEADING";
.	⊃;
.
.<< Generate subsubsection heading and table of contents entry. >>
.
.COUNT SUB2 FROM 1 TO 99 IN SUBSECTION PRINTING "!.1";
.MACRO SSS(NAME)
.	⊂
.		BEGIN "PRINT SUBSUBSECTION HEADING"
.		IF LINES < (4 + 4*SPREAD) THEN SKIP TO LINE 1 ELSE SKIP 1;
.		NEXT SUB2;
.		TURN ON "{";
.		INDENT 6,13,0;
.		NOJUST;
.		RETAIN;
⊗⊗{SUB2!}  NAME⊗
.		SEND CONTENTS
.			⊂
.			INDENT 9,16,4;
.			GUARANTEE LINES 2;
{SUB2!}  NAME→  {PAGE!}
.			⊃;
.		END "PRINT SUBSUBSECTION HEADING";
.	⊃;
.
.<< Generate appendix heading and table of contents entry. >>
.
.COUNT APPENDIX FROM 1 TO 99 PRINTING "A";
.MACRO APP(NAME)
.	⊂
.	SECNAME ← SSNAME ← NULL;
.		BEGIN "PRINT APPENDIX HEADING"
.		NEW SECTION;
.		NEXT APPENDIX;
.		TURN ON "{";
.		INDENT 0,4,0;
.		NOJUST;
.		RETAIN;
⊗⊗Appendix {APPENDIX!}.  NAME⊗
.		SKIP 1;
.		SECNAME ← "Appendix " & APPENDIX!;
.		SSNAME ← "NAME";
.		IF APPENDIX = 1 THEN
.			BEGIN "FIRST TIME"
.			SECTYPE ← "Appendix";
.			SEND CONTENTS
.				⊂
.				IF LINES < (6 + 4*SPREAD)
.					THEN SKIP TO LINE 1
.					ELSE SKIP 2;
.				INDENT 12,18,0;
⊗⊗Appendix→Page⊗
.				⊃;
.			IF SIDES = 1 THEN EVERY HEADING({SECNAME},{SSNAME},{PAGE!});
.			END "FIRST TIME";
.		SEND CONTENTS
.			⊂
.			SKIP 1;
.			INDENT 0,4,4;
.			GUARANTEE LINES 2;
{APPENDIX!}.  NAME→  {PAGE!}
.			⊃;
.		END "PRINT APPENDIX HEADING";
.	⊃;
.
.<< Generate centered subtitle heading without table of contents entry. >>
.
.MACRO CB(TITLE)
.	⊂
.		BEGIN "PRINT CENTERED HEADING"
.		TURN ON "←";
.		IF LINES < (3 + 3*SPREAD) THEN SKIP TO LINE 1;
⊗⊗←TITLE⊗
.		END "PRINT CENTERED HEADING";
.	⊃;
.<< Start text justification. >>
.
.MACRO JUSTIFY
.	⊂
.	FILL;
.	ADJUST;
.	RETAIN;
.	⊃;
.<< Put in a footnote. >>
.
.COUNT FOOTNOTE INLINE FROM 1 TO 999 IN SECTION PRINTING
.	(IF THISDEVICE = "XGP" THEN "%51%*" ELSE "[1]");
.FOOTSEP ← "__________";
.AT "∪∪" ENTRY "∪"
.	⊂
.	NEXT FOOTNOTE;
.	FOOTNOTE!;
.	SEND FOOT
.		⊂
.		BEGIN "NEXT FOOTNOTE"
.		SELECT 1;
.		JUSTIFY;
.		SPACES 1;
.		INDENT 0,0,0;
.		(FOOTNOTE! & " ");
ENTRY
.		END "NEXT FOOTNOTE";
.		⊃;
.	⊃;
.<< Generate table of contents. >>
.
.MACRO COLLECT CONTENTS
.	⊂
.	COUNT PAGE FROM 1 TO 99 PRINTING "i";
.	IF SIDES = 2
.		THEN
.			START "TWO SIDED HEADING"
.			ODD HEADING(,Table of Contents,{PAGE!});
.			EVEN HEADING({PAGE!},Table of Contents,);
.			END "TWO SIDED HEADING"
.		ELSE EVERY HEADING(,Table of Contents,{PAGE!});
.	PORTION CONTENTS;
.	PLACE HEADING;
.	PLACE TEXT;
.	FILL;
.	NOJUST;
.	RETAIN;
.	CRBREAK;
.	PREFACE SPREAD - 1;
.	TURN ON "{→";
.	SECTYPE ← "Section";
.	MACRO GUARANTEE LINES(MINIMUM_LINES)
.		⊂
.		IF LINES < (MINIMUM_LINES*SPREAD + SPREAD - 1) THEN
.			BEGIN "NEW COLUMN"
.			SKIP TO LINE 1;
.			INDENT 12,18,0;
⊗⊗{SECTYPE}→Page⊗
.			END "NEW COLUMN";
.		⊃;
.	INDENT 12,18,0;
⊗⊗Section→Page⊗
.	RECEIVE;
.	⊃;
.<< Set up for body of text. >>
.
.PORTION MAIN
.
.IF SIDES = 2
.	THEN
.		START "TWO SIDED HEADING"
.		EVEN HEADING({PAGE!},,{SECNAME});
.		ODD HEADING({SSNAME},,{PAGE!});
.		END "TWO SIDED HEADING"
.	ELSE EVERY HEADING({SECNAME},,{PAGE!});
.SECNAME ← SSNAME ← NULL;
.PLACE HEADING;
.
.PLACE TEXT;
.SELECT 1;
.JUSTIFY;
.INDENT 0,0,0;
.SPACES 1;
.NEW_PAGE_ON_SECTION TRUE;
.COUNT PAGE FROM 1 TO 999;